package org.yi.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

import org.apache.commons.lang.StringUtils;

public class DateUtils {

	public static final String DEFAULT_PATTERN = "yyyy-MM-dd HH:mm:ss";
	
	public static final String DATE_FORMAT = "yyyy-MM-dd";
	public static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
	/**
	 * @return 获得当前Calendar
	 */
	public static Calendar getCalendar() {
		return Calendar.getInstance();
	}

	/**
	 * @return 获得今年
	 */
	public static int getThisYear() {
		return getCalendar().get(Calendar.YEAR);
	}

	/**
	 * @return 获得本月
	 */
	public static int getThisMonth() {
		return getCalendar().get(Calendar.MONTH) + 1;
	}

	/**
	 * @return 获得当前时间
	 */
	public static Date getNow() {
		return getCalendar().getTime();
	}

	public static String getNow(String pattern) {
		return new SimpleDateFormat(pattern).format(getNow());
	}

	/**
	 * 
	 * @param date
	 * @param day
	 * @return
	 */
	public static Date getIntervalDate(Date date, int day) {
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		c.set(Calendar.DAY_OF_MONTH, c.get(Calendar.DATE) + day);
		return c.getTime();
	}

	/**
	 * 转换时间时区
	 * 
	 * @param convertString
	 *            需要转的时间字符串
	 * @param format
	 *            格式话字符串
	 * @param sourceTimeZone
	 *            源时间时区
	 * @param targetTimeZone
	 *            目标时间时区
	 * @return
	 * @throws ParseException
	 */
	public static Date converDateGMT(Date date, String sourceTimeZone, String targetTimeZone) throws ParseException {

		if (StringUtils.isBlank(sourceTimeZone)) {
			sourceTimeZone = "GMT+8";
		}

		if (StringUtils.isBlank(targetTimeZone)) {
			targetTimeZone = "GMT+8";
		}

		// 获取传入的时间值
		Long time = date.getTime();

		// 获取源时区时间相对的GMT时间
		Long sourceRelativelyGMT = time - TimeZone.getTimeZone(sourceTimeZone).getRawOffset();

		// GMT时间+目标时间时区的偏移量获取目标时间
		Long targetTime = sourceRelativelyGMT + TimeZone.getTimeZone(targetTimeZone).getRawOffset();

		return new Date(targetTime);

	}
	
	/**
	 * get current GMT number, such as GMT+8, the result is 8
	 * @return
	 */
	public static Integer getCurrentGMTNumber() {
		int rawOffset = Calendar.getInstance().getTimeZone().getRawOffset();
		return rawOffset / 3600000;
	}

	/**
	 * 按照指定格式格式化日期字符串
	 * @param date
	 * @param pattern
	 * @return
	 */
	 public static String format(Date date, String pattern) {
    	if(StringUtils.isBlank(pattern)) {
    		pattern = DEFAULT_PATTERN;
    	}
    	return new SimpleDateFormat(pattern).format(date);
    }
    
    /**
     * 按照指定格式格式化时间戳
     * @param timestamp
     * @param pattern
     * @return
     */
    public static String format(Long timestamp, String pattern) {
    	return format(new Date(timestamp), pattern);
    }
    
    /**
     * 按照指定格式将字符串解析为日期
     * @param date
     * @param pattern
     * @return
     * @throws ParseException
     */
    public static Date parse(String date, String pattern) throws ParseException {
    	return new SimpleDateFormat(pattern).parse(date);
    }
    
    /**
     * 按照默认格式将字符串解析为日期， 默认格式为yyyy-MM-dd HH:mm:ss
     * @param date
     * @return
     * @throws ParseException
     */
    public static Date parse(String date) throws ParseException {
    	return new SimpleDateFormat(DEFAULT_PATTERN).parse(date);
    }
    
	/**
	 * 按照默认日期格式格式化当前时间，默认日期格式为 yyyy-MM-dd
	 * @param format
	 * @return
	 */
	public static String formatDate() {
		return format(Calendar.getInstance().getTime(), DATE_FORMAT);
	}
	/**
	 * 按照默认日期格式格式化指定时间，默认日期格式为 yyyy-MM-dd
	 * @param format
	 * @return
	 */
	public static String formatDate(Date d) {
		return format(d, DATE_FORMAT);
	}
	
	/**
	 * 按照默认日期格式格式化当前时间，默认日期格式为 yyyy-MM-dd HH:mm:ss
	 * @param format
	 * @return
	 */
	public static String formatDateTime() throws ParseException{
		return format(Calendar.getInstance().getTime(), DATE_TIME_FORMAT);
	}
	/**
	 * 按照默认日期格式格式化指定时间，默认日期格式为 yyyy-MM-dd HH:mm:ss
	 * @param format
	 * @return
	 */
	public static String formatDateTime(Date d) {
		return format(d, DATE_TIME_FORMAT);
	}
	/**
	 * 按照指定日期格式格式化指定时间
	 * @param format
	 * @return
	 */
	public static String formatDateTime(Date d,String pattern) {
		return format(d, pattern);
	}
	/**
	 * 获取距离指定日期指定天数的日期， 
	 * @param date
	 * @param day 大于0表示向后， 小于0表示向前
	 * @return
	 */
	public static Date getBeforeDate(Date date, int day) {
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		c.set(Calendar.DAY_OF_MONTH, c.get(Calendar.DATE)  + day);
		return c.getTime();
	}
	
	/**
	 * 将指定日期格式化为默认时间格式：yyyy-MM-dd HH:mm:ss
	 * @param d
	 * @return
	 */
	public static String format(Date d) {
		return format(d, DATE_TIME_FORMAT);
	}
	
	/**
	 * 将字符串转换为日期
	 * @param dateStr
	 * @return
	 * @throws ParseException
	 */
	public static Date getDate(String dateStr) throws ParseException {
		return new SimpleDateFormat().parse(dateStr);
	}
	
	/**
	 * 将字符串转换为日期
	 * @param dateStr	字符串格式
	 * @return
	 * @throws ParseException
	 */
	public static Date getDate(String dateStr, String pattern) throws ParseException {
		return new SimpleDateFormat(pattern).parse(dateStr);
	}
	
}
